/**
 * 科目管理工具
 * 提供获取和设置全局科目信息的便捷方法
 */

/**
 * 获取当前选中的科目ID
 * @returns {number|null} 科目ID，如果没有选中则返回null
 */
function getSelectedSubjectId() {
  return wx.getStorageSync('selectedSubjectId') || null;
}

/**
 * 获取当前选中的科目名称
 * @returns {string} 科目名称，如果没有选中则返回空字符串
 */
function getSelectedSubjectName() {
  return wx.getStorageSync('selectedSubjectName') || '';
}

/**
 * 获取当前选中的科目完整信息
 * @returns {object|null} 科目信息对象，包含id、name、icon等
 */
function getSelectedSubject() {
  const id = getSelectedSubjectId();
  const name = getSelectedSubjectName();
  
  if (id && name) {
    return {
      id: id,
      name: name,
      icon: getSubjectIcon(name)
    };
  }
  return null;
}

/**
 * 设置选中的科目
 * @param {number} id 科目ID
 * @param {string} name 科目名称
 */
function setSelectedSubject(id, name) {
  wx.setStorageSync('selectedSubjectId', id);
  wx.setStorageSync('selectedSubjectName', name);
  
  // 同时更新全局应用数据
  const app = getApp();
  if (app && app.globalData) {
    app.globalData.selectedSubject = { id, name };
  }
  
  // 触发全局事件
  if (wx.eventBus && typeof wx.eventBus.emit === 'function') {
    wx.eventBus.emit('subjectChanged', { id, name });
  }
}

/**
 * 检查是否有选中的科目
 * @returns {boolean} 是否有选中的科目
 */
function hasSelectedSubject() {
  return !!(getSelectedSubjectId() && getSelectedSubjectName());
}

/**
 * 清除选中的科目
 */
function clearSelectedSubject() {
  wx.removeStorageSync('selectedSubjectId');
  wx.removeStorageSync('selectedSubjectName');
  
  // 清除全局应用数据
  const app = getApp();
  if (app && app.globalData) {
    app.globalData.selectedSubject = null;
  }
}

/**
 * 根据科目名称获取图标
 * @param {string} subjectName 科目名称
 * @returns {string} 图标路径
 */
function getSubjectIcon(subjectName) {
  const iconMap = {
    '物理': '/images/u27.svg',
    '科学': '/images/u28.svg',
    '化学': '/images/u29.svg',
    '生物学': '/images/u30.svg',
    '数学': '/images/u31.svg',
    '政治': '/images/u32.svg',
    '文学': '/images/u33.svg'
  };
  return iconMap[subjectName] || '/images/u27.svg';
}

/**
 * 监听科目变化事件
 * @param {function} callback 回调函数，参数为 {id, name}
 */
function onSubjectChanged(callback) {
  if (wx.eventBus && typeof wx.eventBus.on === 'function') {
    wx.eventBus.on('subjectChanged', callback);
  }
}

/**
 * 移除科目变化事件监听
 * @param {function} callback 回调函数
 */
function offSubjectChanged(callback) {
  if (wx.eventBus && typeof wx.eventBus.off === 'function') {
    wx.eventBus.off('subjectChanged', callback);
  }
}

/**
 * 获取科目列表（从缓存）
 * @returns {Array} 科目列表
 */
function getSubjectList() {
  return wx.getStorageSync('cachedSubjectList') || [];
}

/**
 * 根据科目ID查找科目信息
 * @param {number} id 科目ID
 * @returns {object|null} 科目信息
 */
function findSubjectById(id) {
  const subjectList = getSubjectList();
  return subjectList.find(subject => subject.id == id) || null;
}

/**
 * 根据科目名称查找科目信息
 * @param {string} name 科目名称
 * @returns {object|null} 科目信息
 */
function findSubjectByName(name) {
  const subjectList = getSubjectList();
  return subjectList.find(subject => subject.name === name) || null;
}

/**
 * 设置默认科目（初次加载时使用）
 * @param {Array} subjectList 科目列表
 * @returns {object} 设置的默认科目信息
 */
function setDefaultSubject(subjectList) {
  if (!subjectList || subjectList.length === 0) {
    console.warn('科目列表为空，无法设置默认科目');
    return null;
  }

  // 选择第一个科目作为默认科目
  const defaultSubject = subjectList[0];
  
  // 设置选中的科目
  setSelectedSubject(defaultSubject.id, defaultSubject.name);
  
  console.log('已设置默认科目:', defaultSubject.name, 'ID:', defaultSubject.id);
  return defaultSubject;
}

/**
 * 确保有默认科目（如果没有选中科目则设置默认科目）
 * @param {Array} subjectList 科目列表
 * @returns {object} 当前选中的科目信息
 */
function ensureDefaultSubject(subjectList) {
  // 检查是否已有选中的科目
  if (hasSelectedSubject()) {
    const selectedSubject = getSelectedSubject();
    // 验证选中的科目是否还在当前科目列表中
    const existingSubject = subjectList.find(subject => subject.id == selectedSubject.id);
    if (existingSubject) {
      console.log('使用已选中的科目:', existingSubject.name);
      return existingSubject;
    } else {
      console.log('已选中的科目不在当前列表中，清除选择');
      clearSelectedSubject();
    }
  }

  // 设置默认科目
  return setDefaultSubject(subjectList);
}

/**
 * 初始化科目系统（应用启动时调用）
 * @param {Array} subjectList 科目列表
 * @returns {object} 当前选中的科目信息
 */
function initializeSubjectSystem(subjectList) {
  if (!subjectList || subjectList.length === 0) {
    console.warn('科目列表为空，无法初始化科目系统');
    return null;
  }

  console.log('初始化科目系统，科目数量:', subjectList.length);
  
  // 确保有默认科目
  const currentSubject = ensureDefaultSubject(subjectList);
  
  // 缓存科目列表
  wx.setStorageSync('cachedSubjectList', subjectList);
  wx.setStorageSync('cachedSubjectListTime', Date.now());
  
  return currentSubject;
}

// 导出所有函数
module.exports = {
  getSelectedSubjectId,
  getSelectedSubjectName,
  getSelectedSubject,
  setSelectedSubject,
  hasSelectedSubject,
  clearSelectedSubject,
  onSubjectChanged,
  offSubjectChanged,
  getSubjectList,
  findSubjectById,
  findSubjectByName,
  setDefaultSubject,
  ensureDefaultSubject,
  initializeSubjectSystem
};
